home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / cdc / src / cdrc_.c < prev    next >
Text File  |  1997-03-29  |  40KB  |  1,780 lines

  1. #define        TrkMax 1024
  2. #define        PrgMax 256
  3. #include    "_TNB.c"
  4. #define        UNchar        unsigned char
  5. #define        UNint        unsigned int
  6. extern    int    SCSI_ID;
  7. extern    int    SCSI_IDF;
  8. extern    short    SCSI_LUN__;
  9. extern    char    SCSI_LUN;
  10. extern    short    LUN_MAX;
  11. extern    short    PLAYSCSTS;    // 1;STSIN待ち 0;待たず
  12. extern    short    LEDVMOD;
  13. extern    short    AutoMode;    // 0:ノーマル 1:オート(含loop)
  14. extern    short    RndMode;    // 0:ノーマル 1:ランダム
  15. extern    short    ReptMode;    // 0:ノーマル 1:リピート
  16. extern    short    MemMode;    // 0:ノーマル 1:メモリー
  17. extern    short    Fadeouting;    // 0:ノーマル 1:フェードアウト中
  18. extern    short    FadeoutVol;    // フェードアウト中のボリューム
  19. extern    short    FadeoutDec;    // フェードアウト中の減り値
  20.  
  21. extern    short    MemLong;    // メモリながさ 0以外ならMEMORY
  22. extern    short    MemPt;        // メモリポインタ
  23. extern    UNchar    MemSock[];    // メモリ
  24. extern    short    RndLong;    // ランダムテーブルながさ 0以外ならMEMORY
  25. extern    short    RndPt;        // ランダムポインタ
  26. extern    UNchar    RndSock[];    // ランダムテーブル
  27. extern    short    TrkNo;        // 演奏中 トラックナンバー/メモリポインタ
  28. extern    short    TrkNoS;        // 演奏中 トラックナンバー/メモリポインタ
  29. extern    short    PauseMode;    // 0:特に 1:ポーズ中
  30. extern    short    ExTrak;        // 1;拡張トラックあり
  31. extern    short    CeTrak;        // 1;拡張トラックあり
  32. extern    short    OvTrak;        // 1;トラックが足りなかった
  33. extern    short    DtTrak;        // 1;データトラック有り
  34. extern    short    MD_SeqSecTrak;    // 1;MD セパレートトラック有り
  35. extern    short    MD_MonoTrak;    // -1;MONOトラックのみ,1;有り(禁止),0;なし
  36. extern    short    MD_PlayOnly;    //  0;録再MEDIA 1;再生専用MEDIA
  37.  
  38. extern    short    Volum;        // ボリューム
  39. extern    short    MastVol;    // マスターボリューム
  40.  
  41. extern    char    LEDBUF[10][16];    //テキスト表示用のパターンバンク
  42. extern    char    NAMEBUF[40][16];//表示幅は 36
  43. extern    char    CHARBUF[40];    //LEDに表示されている文字列
  44.  
  45. extern    short    CDIN;        //0:CDは入っていない 1:入っている
  46. extern    int    CdListS;    //CDLISTにあるなら 1 
  47. extern    int    CdcTrak;    // 
  48. extern    int    CdTrak;        // 
  49. extern    int    CdLong;        // 長さ
  50. extern    UNchar    CdName[40];    // CD名
  51. extern    char    ListName[TrkMax][40];    // 名前
  52. extern    int    ListLong[TrkMax];    // ながさ時間
  53. extern    int    ListStTm[TrkMax];    // スタート時間
  54. extern    char    (*pListName)[][40];    // 名前
  55. extern    int    (*pListLong)[];    // ながさ時間
  56. extern    int    (*pListStTm)[];    // スタート時間
  57.  
  58. extern    int    O_CdTrak;        // 
  59. extern    int    O_ListStTm[100];    // スタート時間
  60. extern    int    O_ListLong[100];    // ながさ時間
  61. extern    UNchar    ListTrak[9][100];    //
  62. extern    UNchar    TitleTy[9];
  63.  
  64. extern    short    CddevSw;        //0: SCSI直接 1:計測IOCTRL
  65. extern    short    CddDrvNo;        //計測IOCTRL用ドライヴNO
  66. extern    short    DeviType;        //5or4=CD-ROM 0x10=MD
  67. extern    int    PlayingTimeMD;
  68.  
  69. extern    short    JukeBox;    // 0:ノーマル 1:JukeBox
  70.  
  71. extern    int    cps_ot;
  72.  
  73. extern UNchar *SetNameAdd;
  74.  
  75. /********************
  76.     常駐部
  77. *********************/
  78. /*------------------------------*/
  79. /*    構造体            */
  80. /*------------------------------*/
  81. typedef struct {
  82.     int    fg;            /* 状態 0x11 演奏中,0x12 演奏中断 */
  83.     int    track_no;        /* 曲番号 */
  84.     int    time;            /* 現在の演奏時間 */
  85.     int    address;        /* 演奏アドレス */
  86.     int    track_long;        /* 演奏中の曲のながさ*/
  87. } PLYINF;
  88. extern    PLYINF plyinf;
  89.  
  90. #define    min    1
  91. #define    max    CdTrak
  92. #define    MULU(o1,o2) ( (unsigned short)(o1)*(unsigned short)(o2) )
  93. #define    MULS(o1,o2) ( (short)(o1)*(short)(o2) )
  94.  
  95. #define    TIMES(TT)    ( __udivsi3( __mulsi3((TT),1000),979) )
  96. #define    TIMESR(TT)    ( __udivsi3( __mulsi3((TT),979),1000) )
  97. //#define    FREMS(TT)    ( MULU((TT),4800) / 1024 )
  98. #define    FREMS(TT)    ( FREMS_TABLE[(TT)] )
  99. #define    FREMSR(TT)    ( DIVU((TT)*1024+512,4800) )
  100.  
  101. extern    UNchar    FREMS_TABLE[16];
  102.  
  103. extern    int    CdPlayEndAdds;
  104. extern    int    CdPlayEndTrak;
  105. static    short    ChnLunWaiting=-1;        //
  106.  
  107. static    short    PlayScMd=0;        //1;STSIN待ち 0;待たず
  108.  
  109. static    char    JkDfPrgTY=0;    //Def.Prg.のあるトレイ数
  110. static    char    JkDfPrgMd=0;    // '_<..>' が、1;あった 0;ない
  111.  
  112. /*----------------------------------------------------------------------------
  113.             演奏ルーチン
  114. ----------------------------------------------------------------------------*/
  115. /**************************************
  116.     演奏する。
  117.     [何番演奏する]
  118.         start=
  119.             Track No
  120.             0x100越の場合 MSF指定になる
  121.         end=
  122.             Track No
  123.             -1の場合 max に
  124.              0の場合 startのトラックの最後まで指定
  125.             0x100越の場合 MSF指定になる
  126. [戻り値] マイナス:エラー
  127.         1:MDメディア
  128.         2:LUN変更のため 待ち
  129. ****************************************/
  130. int    CdPlay_hf( int start, int end )
  131. {
  132. PlayScMd=1;
  133. return( CdPlay( start,end ) );
  134. }
  135. /*++++++*/
  136. int    CdPlay( int start, int end )
  137. {
  138. int    start_address,leadout_address;
  139. int    end_address;
  140. int    start_track,stop_track;
  141. int    i;
  142. int    PSM;
  143. leadout_address=CdLong;
  144. CdPlayEndAdds=end;
  145. ChnLunWaiting=-1;        //
  146. Fadeouting=0;        // 0:ノーマル 1:フェードアウト中
  147. FadeoutVol=Volum;    // フェードアウト中のボリューム
  148. CdPlayEndTrak=-1;    //演奏止まったらそれで終わり
  149. cps_ot=-1;
  150. PSM=PlayScMd;
  151. PlayScMd=0;
  152. start_track=-1;
  153. if ( O_CdTrak==1 && O_ListStTm[1]<0 ){    //AudioTrack無し
  154.     TrkNo=0;
  155.     //fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
  156.     return(-2);
  157. }
  158. if ( start<0x100 && (start<min || start>max) ){
  159.     TrkNo=0;
  160.     StpDsk();
  161.     //fprintf_(1,"指定された曲番号は、存在しません。\n");
  162.     return(-4);
  163. }
  164.  
  165. if ( end==0 || end==start ){
  166.     CdPlayEndTrak=-1;    //演奏止まったらそれで終わり
  167. } else if ( end<0 ){
  168.     CdPlayEndTrak=0;    //さいごまで
  169. } else if ( end<0x100 ){
  170.     CdPlayEndTrak=end;
  171. }
  172.  
  173. if ( end<0 ){
  174.     end = max;
  175.     if ( JukeBox!=0 )
  176.         end = 0;    //Jukeモードなら1曲づつ
  177.     if ( MD_SeqSecTrak!=0 )
  178.         end = 0;    //MD セパレートトラック有りなら1曲ずつ
  179. }
  180. if ( end>0 && end<0x100 && (end<min || end>max) ){
  181.     TrkNo=0;
  182.     StpDsk();
  183.     //fprintf_(1,"指定された曲番号は、存在しません。\n");
  184.     return(-4);
  185. }
  186. if ( start<0x100 ){
  187.     start_address = (*pListStTm)[start];    // スタート時間
  188.     start_track=start;
  189.     if ( start_address>=0 ){
  190.         ;
  191.     } else if ( CdPlayEndAdds<0 && start==1 && max!=1 ){
  192.         i=CdPlay( 2,-1 );    //MegaD. Towns CD 対策
  193.         if ( i==0 ) i=1;
  194.         return( i );
  195.     } else {
  196.         TrkNo=0;
  197.         StpDsk();
  198.         //fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
  199.         return(-2);
  200.     }
  201.     plyinf.address=start_address;    /* 演奏アドレス */
  202.     plyinf.track_no=start;        /* 曲番号 */
  203.     plyinf.time=0;            /* 現在の演奏時間 */
  204. } else {
  205.     start_track=-1;
  206.     start_address = start;
  207.     plyinf.address= start;
  208.     ChkPlyDispA();
  209.     //ChkPlyDispA( &plyinf.fg );
  210. }
  211. if ( end==0 ){
  212.     end_address = addtime((*pListStTm)[plyinf.track_no],(*pListLong)[plyinf.track_no]);
  213.     end_address = subtime(end_address,1);
  214.     stop_track=plyinf.track_no;
  215. } else if ( end<0x100 ){
  216.     end_address = addtime((*pListStTm)[end],(*pListLong)[end]);
  217.     end_address = subtime(end_address,1);
  218.     stop_track=end;
  219. } else {
  220.     end_address=end;
  221.     stop_track=-1;
  222. }
  223. /* 演奏開始 */
  224. if ( JukeBox!=0 && (start_address&0x10000000)!=0 ){
  225.     //LUN変更
  226.     //    (T00KLLLL_MMMMMMMM_SSSSSSSS_FFFFFFFF)
  227.     //        ^ロジカル有効フラグ
  228.     //         ^^^^ ロジカル
  229.     i=(start_address/0x01000000)&0xF;
  230.     if ( i!=SCSI_LUN__ ){
  231.         StpDsk();        // 一応前のトレイの演奏を止める
  232.         SetLUN_( i );
  233.         //ejeload();        //トレイを出して直ぐ戻す。MBR-7ならいいが・・・
  234.         //return(2);
  235.     }
  236. }
  237. if ( DeviType==0x10 && MD_MonoTrak!=0 ){    // -1;MONOトラックのみ,1;有り(禁止),0;なし
  238.     // MD で、モノラルトラック
  239.     start_address = halftime( start_address );
  240.     end_address =  halftime( end_address );
  241. }
  242. TrkNo=0;
  243. if ( MastVol )
  244.     ChnVol(Volum);
  245. if ( DeviType!=0x10 || start_track<0 || ExTrak!=0 ){
  246.     if ( PLAYSCSTS==0 || PSM==0 )
  247.         i=PlyDsk( start_address, end_address );
  248.     else    i=PlyDsk_hf( start_address, end_address );
  249. } else {
  250.  
  251.     start_track = start_track - ListTrak[SCSI_LUN__][1] + 1;
  252.     stop_track = stop_track - ListTrak[SCSI_LUN__][1] + 1;
  253.  
  254.     if ( PLAYSCSTS==0 || PSM==0 )
  255.         i=PlyDskTrack( start_track, stop_track );
  256.     else    i=PlyDskTrack_hf( start_track, stop_track );
  257. }
  258. if ( i!=0 ){
  259.     TrkNo=0;
  260.     StpDsk();
  261.     //fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
  262.     return(-2);
  263. }
  264. plyinf.fg=0x11;            /* 状態 0x11 演奏中,0x12 演奏中断 */
  265. TrkNo=plyinf.track_no;
  266. TrkNoS=TrkNo;
  267. SetTrkLong();
  268. WaitCC2();
  269. return(0);
  270. }
  271. /**************************************
  272.     全曲を演奏する
  273. [戻り値] マイナス:エラー
  274. **************************************/
  275. int    CdPlay_all( void )
  276. {
  277. return( CdPlay( 1,-1 ) );
  278. }
  279. /*----------------------------------------------------------------------------
  280.             演奏補ルーチン
  281. ----------------------------------------------------------------------------*/
  282. /************************************
  283.       [UNDO] [R.UP][R.DN]
  284.     演奏を再開させる(曲単位)
  285. [引数] 現在からの±No ☆メモリ対応
  286. [戻り値] マイナス:エラー
  287. ************************************/
  288. int    CdPlay_restart( int no )
  289. {
  290. int    i,r;
  291. if ( TrkNo==0 )
  292.     return(-1);
  293. if ( RndMode ){
  294.     /*ランダムモード*/
  295.     if ( no==0 ){
  296.         i= TrkNo;
  297.         r=CdPlay( i,i );
  298.     } else {
  299.         if ( ++RndPt>=RndLong ){
  300.             i=CdPlay_Rnd2();
  301.             r=CdPlay( i,i );
  302.         } else {
  303.             i=RndSock[RndPt];
  304.             r=CdPlay( i,i );
  305.         }
  306.         if ( r<0 ){
  307.             if ( ++RndPt>=RndLong ){
  308.                 i=CdPlay_Rnd2();
  309.                 r=CdPlay( i,i );
  310.             } else {
  311.                 i=RndSock[RndPt];
  312.                 r=CdPlay( i,i );
  313.             }
  314.         }
  315.         MemChkT();
  316.     }
  317.     return( r );
  318. }
  319. if ( MemLong==0 ){    /*メモリされていない*/
  320.     /* 最後まで演奏する */
  321.     i= TrkNo + no;
  322.     if ( i<min ) i=max;
  323.     if ( i>max ) i=min;
  324.     if ( ReptMode )
  325.         r=CdPlay( i,i );//ランダムならその曲のみ
  326.     else    r=CdPlay( i,-1 );
  327.     if ( r<0 ){
  328.         i+=no;
  329.         if ( i<min ) i=max;
  330.         if ( i>max ) i=min;
  331.         if ( ReptMode )
  332.             r=CdPlay( i,i );//ランダムならその曲のみ
  333.         else    r=CdPlay( i,-1 );
  334.     }
  335.     return( r );
  336. } else {
  337.     /*メモリされている*/
  338.     if ( no==0 ){
  339.         i= TrkNo;
  340.     } else {
  341.         i=MemPt+no;
  342.         if ( i<0 )     i=MemLong-1;
  343.         if ( i>=MemLong ) i=0;
  344.         MemPt=i;
  345.         i=MemSock[i];
  346.     }
  347.     r=CdPlay( i,i );
  348.     return( r );
  349. }
  350. return(-1);
  351. }
  352. /********************************
  353.     シーク処理(値を戻すだけ)
  354. [引数] 現在からの巻き戻し(-1)早送り(+1)
  355. [戻り値] 目的MSF
  356.     0なら動けない
  357. ********************************/
  358. int    SeekDisp(int no)
  359. {
  360. extern    short    TsekSw;
  361. int    i,l;
  362. extern    int    SeekNow;    //*
  363. extern    short    SeekNowTk;    //*_SeekNow補佐 trakno
  364. if ( TrkNo==0 || no==0 )
  365.     return(0);
  366. if ( SeekNow<0 ){
  367.     /* 初めてのコール*/
  368.     SeekNow=plyinf.time;
  369.     SeekNowTk=plyinf.track_no;
  370. }
  371. if ( TsekSw<30 )    l=22;    //0.3秒単位
  372. else if ( TsekSw<60 )    l=37;    //0.5秒単位
  373. else            l=0x100;//1.0秒単位
  374. if ( no<0 ){
  375.     i=SeekNow;
  376.     SeekNow=subtime(SeekNow,l);
  377.     if ( SeekNow>i || SeekNow<0 )
  378.         SeekNow=0;
  379. } else {
  380.     if ( SeekNow<=subtime((*pListLong)[SeekNowTk],0x200) )
  381.         SeekNow=addtime(SeekNow,l);
  382.     else    SeekNow=subtime((*pListLong)[SeekNowTk],0x100);
  383. }
  384. return( SeekNow+1 );
  385. }
  386. /*************************************************************
  387.     ChkPlyバッファー調整
  388.             MD の場合は時間通りならんでいないので、
  389.             チェックにもう一ついる・・。
  390. *************************************************************/
  391. void    ChkPlyDisp()
  392. {
  393. int    i,t,ie;
  394. int    ad,ln;
  395. t=(plyinf.track_no&0xFFFF);
  396. ad=plyinf.address;
  397. ie= ListTrak[SCSI_LUN__][t];
  398. if ( JukeBox==0 ){
  399.     if ( DeviType!=0x10 ){        //5or4=CD-ROM 0x10=MD
  400.         for(i=ie;i<=max;i++){
  401.             if ( ad<( (*pListStTm)[i]&0xFFFFFF) )
  402.                 break;
  403.         }
  404.         i--;
  405.     } else {
  406.         for(i=ie;i<=max;i++){
  407.             if ( ad>=((*pListStTm)[i]&0xFFFFFF) && subtime(ad,(*pListStTm)[i])<((*pListLong)[i]&0xFFFFFF) )
  408.                 break;
  409.         }
  410.         if ( i>max ){
  411.             i=plyinf.track_no&0xFFFF;
  412.             //i=max; こっちのほうがいいかも
  413.         }
  414.     }
  415. } else {
  416.     ln=(SCSI_LUN__)*0x01000000;
  417.     if ( DeviType!=0x10 ){        //5or4=CD-ROM 0x10=MD
  418.         for(i=ie;i<=max;i++){
  419.             if ( ((*pListStTm)[i]&0x0F000000)!=ln )
  420.                 break;
  421.             if ( ad<( (*pListStTm)[i]&0xFFFFFF) )
  422.                 break;
  423.         }
  424.         i--;
  425.     } else {
  426.         for(i=ie;i<=max;i++){
  427.             if ( ((*pListStTm)[i]&0x0F000000)!=ln )
  428.                 break;
  429.             if ( ad>=((*pListStTm)[i]&0xFFFFFF) && subtime(ad,(*pListStTm)[i])<((*pListLong)[i]&0xFFFFFF) )
  430.                 break;
  431.         }
  432.         if ( i>max )
  433.             i=plyinf.track_no&0xFFFF;
  434.     }
  435. }
  436. plyinf.track_no=i;
  437. plyinf.time=subtime(ad,(*pListStTm)[i]);
  438. }
  439. /*++++++++*/
  440. void    ChkPlyDispA() //adのみから計算
  441. {
  442. int    i,ie;
  443. int    ad,ln;
  444. plyinf.track_no=1;
  445. ChkPlyDisp();
  446. }
  447. /*+++++++++++++++*/
  448. void CPD_MDSUB( PLYINF *pi ) //adのみから計算
  449. {
  450. static UNchar ZenTrk=0;
  451. int    i,ie;
  452. int    ad,ln;
  453. ad= pi->address;
  454. if ( JukeBox==0 ){
  455.     for(i=min;i<=max;i++){
  456.         if ( ad>=((*pListStTm)[i]&0xFFFFFF) && subtime(ad,(*pListStTm)[i])<((*pListLong)[i]&0xFFFFFF) )
  457.             break;
  458.     }
  459.     if ( i>max ){
  460.         //なぜか無かった 前のトラックを使用
  461.         i=ZenTrk;
  462.     }
  463. } else {
  464.     ie= ListTrak[SCSI_LUN__][1];
  465.     ln=(SCSI_LUN__)*0x01000000;
  466.     for(i=ie;i<=max;i++){
  467.         if ( ((*pListStTm)[i]&0x0F000000)!=ln )
  468.             break;
  469.         if ( ad>=((*pListStTm)[i]&0xFFFFFF) && subtime(ad,(*pListStTm)[i])<((*pListLong)[i]&0xFFFFFF) )
  470.             break;
  471.     }
  472.     if ( i>max ){
  473.         //なぜか無かった 前のトラックを使用
  474.         i=ZenTrk;
  475.     } else {
  476.         // 補正
  477.         i=i-ie+1;
  478.     }
  479. }
  480. // 設定
  481. pi->track_no=i;
  482. ZenTrk=i;
  483. if ( ((*pListLong)[pi->track_no]&0x40000000)==0 ){
  484.     pi->time=subtime(ad,(*pListStTm)[i]);
  485. } else {
  486.     if ( PlayingTimeMD>=0 ){
  487.         i=TIMES(PlayingTimeMD);            //補正後のアドレス
  488.         // MSF型に変換
  489.         pi->time = DIVU(i/0x10,60)*0x10000 + MODU(i/0x10,60)*0x100 + FREMS(i&0xF);
  490.     } else {
  491.         pi->time=subtime(ad,(*pListStTm)[i]);
  492.     }
  493. }
  494. }
  495. /**************************************/
  496. void    SetTrkLong()
  497. {
  498. plyinf.track_long=(*pListLong)[TrkNo];    // ながさ時間
  499. }
  500. /*************************************
  501.     時間 bcd 同志の引き算  t1-t2
  502. **************************************/
  503. int subtime( int t1,int t2 )
  504. {
  505. /*    00:mm:ss:xx 何分何秒何1/75秒    */
  506. short    t1m,t1s,t1u;
  507. short    t2m,t2s,t2u;
  508. t1m=(t1>>16) & 0xff;
  509. t1s=(t1>>8 ) & 0xff;
  510. t1u=(t1    ) & 0xff;
  511.  
  512. t2m=(t2>>16) & 0xff;
  513. t2s=(t2>>8 ) & 0xff;
  514. t2u=(t2    ) & 0xff;
  515.  
  516. if ( (t1u-=t2u)<0 ){
  517.     if ( (t1u+=75)<0 )
  518.         t1u+=75;
  519.     t2s++;    //秒のマイナス値を+1
  520. }
  521. if ( (t1s-=t2s)<0 ){
  522.     if ( (t1s+=60)<0 )
  523.         t1s+=60;
  524.     t2m++;    //分のマイナス値を+1
  525. }
  526. if ( (t1m-=t2m)<0 )    //ここでマイナス値はおかしいはずなのだ
  527.     return( 0 );
  528. return( (t1m<<16)|(t1s<<8)|t1u );
  529. }
  530. /*+++++++++*/
  531. int subtime_( int t1,int t2 )
  532. {
  533. /*    00:mm:ss:xx 何分何秒何1/75秒    */
  534. short    t1m,t1s,t1u;
  535. short    t2m,t2s,t2u;
  536. t1m=(t1>>16) & 0xfff;
  537. t1s=(t1>>8 ) & 0xff;
  538. t1u=(t1    ) & 0xff;
  539.  
  540. t2m=(t2>>16) & 0xff;
  541. t2s=(t2>>8 ) & 0xff;
  542. t2u=(t2    ) & 0xff;
  543.  
  544. if ( (t1u-=t2u)<0 ){
  545.     if ( (t1u+=75)<0 )
  546.         t1u+=75;
  547.     t2s++;    //秒のマイナス値を+1
  548. }
  549. if ( (t1s-=t2s)<0 ){
  550.     if ( (t1s+=60)<0 )
  551.         t1s+=60;
  552.     t2m++;    //分のマイナス値を+1
  553. }
  554. if ( (t1m-=t2m)<0 )    //ここでマイナス値はおかしいはずなのだ
  555.     return( 0 );
  556. return( (t1m<<16)|(t1s<<8)|t1u );
  557. }
  558. /*+++++++++*/
  559. int subtime__( int t1,int t2 )
  560. {
  561. /*    00:mm:ss:xx 何分何秒何1/75秒    */
  562. short    t1m,t1s,t1u;
  563. short    t2m,t2s,t2u;
  564. t1m=(t1>>16) & 0xfff;
  565. t1s=(t1>>8 ) & 0xff;
  566. t1u=(t1    ) & 0xff;
  567.  
  568. t2m=(t2>>16) & 0xfff;
  569. t2s=(t2>>8 ) & 0xff;
  570. t2u=(t2    ) & 0xff;
  571.  
  572. if ( (t1u-=t2u)<0 ){
  573.     if ( (t1u+=75)<0 )
  574.         t1u+=75;
  575.     t2s++;    //秒のマイナス値を+1
  576. }
  577. if ( (t1s-=t2s)<0 ){
  578.     if ( (t1s+=60)<0 )
  579.         t1s+=60;
  580.     t2m++;    //分のマイナス値を+1
  581. }
  582. if ( (t1m-=t2m)<0 )    //ここでマイナス値はおかしいはずなのだ
  583.     return( 0 );
  584. return( (t1m<<16)|(t1s<<8)|t1u );
  585. }
  586. /*************************************
  587.     時間 bcd 同志の足し算  t1+t2
  588.  _ ; 100分越対応
  589. **************************************/
  590. int addtime( int t1,int t2 )
  591. {
  592. /*    00:mm:ss:xx 何分何秒何1/75秒    */
  593. short    t1m,t1s,t1u;
  594. short    t2m,t2s,t2u;
  595. t1m=(t1>>16) & 0xff;
  596. t1s=(t1>>8 ) & 0xff;
  597. t1u=(t1    ) & 0xff;
  598.  
  599. t2m=(t2>>16) & 0xff;
  600. t2s=(t2>>8 ) & 0xff;
  601. t2u=(t2    ) & 0xff;
  602.  
  603. if ( (t1u+=t2u)>=75 ){
  604.     t1u-=75;
  605.     t1s++;
  606. }
  607. if ( (t1s+=t2s)>=60 ){
  608.     t1s-=60;
  609.     t1m++;
  610. }
  611. t1m+=t2m;
  612. return( (t1m<<16)|(t1s<<8)|t1u );
  613. }
  614. /*+++++*/
  615. int addtime_( int t1,int t2 )
  616. {
  617. /*    00:mm:ss:xx 何分何秒何1/75秒    */
  618. short    t1m,t1s,t1u;
  619. short    t2m,t2s,t2u;
  620. t1m=(t1>>16) & 0xfff;
  621. t1s=(t1>>8 ) & 0xff;
  622. t1u=(t1    ) & 0xff;
  623.  
  624. t2m=(t2>>16) & 0xff;
  625. t2s=(t2>>8 ) & 0xff;
  626. t2u=(t2    ) & 0xff;
  627.  
  628. if ( (t1u+=t2u)>=75 ){
  629.     t1u-=75;
  630.     t1s++;
  631. }
  632. if ( (t1s+=t2s)>=60 ){
  633.     t1s-=60;
  634.     t1m++;
  635. }
  636. t1m+=t2m;
  637. return( (t1m<<16)|(t1s<<8)|t1u );
  638. }
  639. /*************************************
  640.     時間 bcd の1/2算  t1/+=2
  641. **************************************/
  642. int halftime( int t1 )
  643. {
  644. /*    00:mm:ss:xx 何分何秒何1/75秒    */
  645. short    t1m,t1s,t1u;
  646. t1m=(t1>>16) & 0xff;
  647. t1s=(t1>>8 ) & 0xff;
  648. t1u=(t1    ) & 0xff;
  649. if ( t1m&1 )
  650.     t1s+=60;
  651. if ( t1s&1 )
  652.     t1u+=75;
  653. t1m/=2;
  654. t1s/=2;
  655. t1u/=2;
  656. return( (t1m<<16)|(t1s<<8)|t1u );
  657. }
  658. /*************************************
  659.     数値 ->  bcd
  660. **************************************/
  661. int    tim2msf(s)
  662. int    s;
  663. {
  664. int    i,j,r;
  665. i=DIVU(s,100*60);
  666. j=MODU(DIVU(s,100),60);
  667. r=MODU(s,100);
  668.     r=MULU(r,75);    // 1/100s を 1/75s に変換
  669.     r=DIVU(r,100);
  670. return( i*0x10000+j*0x100+r );
  671. }
  672. /*************************************
  673.    演奏時間の計算
  674. **************************************/
  675. void    ProgTimeCalc(st)
  676. int    *st;
  677. {
  678. int    i;
  679. int    s0;
  680. if ( TrkNo==0 ){
  681.     st[0]=st[1]=0;
  682. } else if ( ReptMode ){        // 0:ノーマル 1:リピート
  683.     st[0]=(*pListLong)[TrkNo];        // 長さ
  684.     st[1]=0;
  685. } else if ( RndPt>=0 ){        // ランダムポインタ
  686.     s0=0;
  687.     for(i=0;i<RndPt;i++)
  688.         s0=addtime_(s0,(*pListLong)[RndSock[i]]);
  689.     st[1]=s0;
  690.     for(;i<RndLong;i++)
  691.         s0=addtime_(s0,(*pListLong)[RndSock[i]]);
  692.     st[0]=s0;
  693. } else if ( MemPt>=0 ){        // メモリポインタ
  694.     s0=0;
  695.     for(i=0;i<MemPt;i++)
  696.         s0=addtime_(s0,(*pListLong)[MemSock[i]]);
  697.     st[1]=s0;
  698.     for(;i<MemLong;i++)
  699.         s0=addtime_(s0,(*pListLong)[MemSock[i]]);
  700.     st[0]=s0;
  701. } else if ( CdPlayEndAdds<0 ){
  702.     st[0]=subtime(CdLong,(*pListStTm)[1]);        // 長さ
  703.     st[1]=subtime((*pListStTm)[TrkNo],(*pListStTm)[1]);
  704. } else {
  705.     st[0]=(*pListLong)[TrkNo];        // 長さ
  706.     st[1]=0;
  707. }
  708. }
  709. /*----------------------------------------------------------------------------
  710.             タイトルルーチン
  711. ----------------------------------------------------------------------------*/
  712. /************************************************
  713.     引数により名前ポインタアドレス
  714. [戻り値] アドレス
  715. *************************************************/
  716. char    *NamePoint(kn,ofs)
  717. int    kn,ofs;
  718. {
  719. int    i,l;
  720. char    *s;
  721. if ( (*pListLong)[kn]>=0 )
  722.     return((*pListName)[kn]);
  723. //拡張曲名あり
  724. for(l=CdcTrak-1;l>CdTrak;l--){
  725.     i=(*pListLong)[l];
  726.     if ( (i&0xFF0000)==0xFF0000 ){
  727.         if ( (i&0xFF)==kn )
  728.             break;
  729.     }
  730. }
  731. if ( l<=CdTrak )
  732.     return((*pListName)[kn]);    //なぜか無い
  733. s=(*pListName)[kn];
  734. for(;l>CdTrak;l--){
  735.     i=(*pListLong)[l];
  736.     if ( (i&0xFF0000)!=0xFF0000 )
  737.         break;
  738.     if ( (i&0xFF)!=kn )
  739.         break;
  740.     if ( ofs>=((*pListStTm)[l]&0xFFFFFF) )
  741.         s=&(*pListName)[l][2];
  742. }
  743. return(s);
  744. }
  745. /*************************************************************
  746.     LED表示文字列制作
  747. *************************************************************/
  748. #define jstrlen(SR)                                \
  749. ({     char *st_=(SR);    int l_=0,c_;                        \
  750.     while( c_=*(st_++) ){                            \
  751.         l_++;                                \
  752.         if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){                \
  753.              l_++; st_++;                        \
  754.         }                                \
  755.     } (l_);                                    \
  756. })
  757. #define jstrlen_(SR)                                \
  758. ({     char *st_=(SR);    int l_=0,c_;                        \
  759.     while( c_=*(st_++) ){                            \
  760.         l_++;                                \
  761.         if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){                \
  762.             if ( c_>0x80 && c_<0xF0 )                \
  763.                 l_++;                        \
  764.             st_++;                            \
  765.         }                                \
  766.     } (l_);                                    \
  767. })
  768. /*+++++++++*/
  769. void    SetNameLed(na,tt)
  770. UNchar    *na;
  771. int    tt;
  772. {
  773. int    i,l,c,s;
  774. UNchar    *ad=(void*)NAMEBUF;
  775. UNchar    *ac=(void*)CHARBUF;
  776. i=0;
  777. if ( SetNameAdd==na )    //既に書いた
  778.     return;
  779. if ( (tt&0x10000000)!=0 )
  780.     s=TitleTy[(tt/0x01000000)&0xF];
  781. else    s=CdName[0];
  782. SetNameAdd=na;
  783. if ( s!=' ' ){    // CD名
  784.     l=jstrlen(na);
  785.     for(;i<(36-l)/2;i++,ad+=16){
  786.         SetSp(ad);
  787.         *ac++=0x20;
  788.     }
  789. }
  790. for(;i<40-1;i++,ad+=16){
  791.     c=(*ac++=*na++);
  792.     if ( c==0 )
  793.         break;
  794.     if ( (c>=0x80 && c<=0x9f) || c>=0xE0 ){
  795.         i++;
  796.         c=c*0x100+(*ac++=*na++);
  797.         if ( SetFont(ad,c)==2 )
  798.             ad+=16;
  799.     } else {
  800.         SetFont1b(ad,c);
  801.     }
  802. }
  803. for(;i<40-1;i++,ad+=16)
  804.     SetSp(ad);
  805. }
  806. /*----------------------------------------------------------------------------
  807.             タイトルリスト解析ルーチン
  808. ----------------------------------------------------------------------------*/
  809. static short    CL_StTrk,CL_BkTrk,CL_ProgN;
  810. static short    CL_OfsTrk;
  811. /*+++++++++++++*/
  812. /************************************************
  813.     CDCLISTより、現在のCDちぇっっく
  814. [戻り値] 0 :
  815.     -1 : ERR!
  816. *************************************************/
  817. int    CdListSub()
  818. {
  819. int    l,r;
  820. CdListS=0;    //CDLISTにあるなら 1 
  821. ExTrak=0;
  822. CeTrak=0;
  823. DtTrak=0;
  824. MD_SeqSecTrak=0;        // 1;MD セパレートトラック有り
  825. MD_MonoTrak=0;            // -1;MONOトラックのみ,1;有り(禁止),0;なし
  826. MemLong=0;        //メモリながさ
  827. CL_OfsTrk=0;
  828. for(l=0;l<100;l++)
  829.     O_ListLong[l]=0;
  830. for(l=0;l<CdcTrak;l++){
  831.     (*pListLong)[l]=0;
  832.     (*pListName)[l][0]=0;
  833.     (*pListName)[l][2]=0;
  834. }
  835. r=CdListSub__();
  836. return( r );
  837. }
  838. /*********************
  839.    SUB
  840. *********************/
  841. int    CdListSub__()
  842. {
  843. int    i,l,r;
  844. char    tt;
  845. int    leadout_address,min_,max_;
  846. int    start,end;
  847. int    lst[100];
  848. int    lstl[100];
  849. CdLong=0;            // 長さ
  850. if ( CDROM_chk() ){
  851.     if ( CDROM_chk() ){
  852.         //fprintf_(1,"SCSI-ID=%2 の装置は、CD-ROM ではないようです。\r\n",SCSI_ID );
  853.         return(-100);
  854.     }
  855. }
  856. r = RedTOC(&leadout_address,&min_,&max_);
  857. if ( r!=0 )
  858.     r = RedTOC(&leadout_address,&min_,&max_);
  859. end = leadout_address;
  860. if ( max_>CdcTrak ) max_=CdcTrak;
  861. /*はじめにチェック*/
  862. O_CdTrak=max_;
  863. CdTrak=max_;
  864. CdName[0]=0;
  865. TitleTy[SCSI_LUN__]=0;
  866. if ( r!=0 ){
  867.     //fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
  868.     return(-1);
  869. }
  870. CdLong=end;            // 長さ
  871. if ( Music_inf_all( min_,max_,&lst,&lstl ) ){
  872.     if ( Music_inf_all( min_,max_,&lst,&lstl ) ){
  873.         //fprintf_(1,"Start Track Address or ReadTOC Command error.\r\n");
  874.         return(-1);
  875.     }
  876. }
  877. tt=0;
  878. for(l=min_;l<=max_;l++){
  879.     start=lst[l];
  880.     O_ListStTm[l]=start+(SCSI_LUN__*0x01000000+0x10000000);
  881.     if ( start<0 )
  882.         DtTrak=1;    //1;データトラック有り
  883.     else    tt=1;        //1;音楽トラック有り
  884.     if ( DeviType!=0x10 ){
  885.         if( l==max_ ){
  886.             end = subtime( leadout_address,1 );
  887.         } else {
  888.             end=lst[l+1];
  889.             end = subtime( end,1 );
  890.         }
  891.         i= addtime( subtime( end,start ),1 );
  892.         O_ListLong[l]=i;        // 長さ
  893.     } else {
  894.         // MD
  895.         end = addtime( start,lstl[l] );
  896.         end = subtime( end,1 );
  897.         i=lstl[l];            // 長さ
  898.         O_ListLong[l]=i;        // 長さ
  899.         if ( (i&0x40000000)!=0 )    //セパレートセクタフラグ
  900.             MD_SeqSecTrak=1;        // 1;MD セパレートトラック有り
  901.         if ( (i&0x20000000)!=0 ){    //MONOフラグ
  902.             if ( MD_MonoTrak==0 )
  903.                 MD_MonoTrak=-1;    // -1;MONOトラックのみ,1;有り(禁止),0;なし
  904.         } else {
  905.             if ( MD_MonoTrak!=0 )
  906.                 MD_MonoTrak=1;    // -1;MONOトラックのみ,1;有り(禁止),0;なし
  907.         }
  908.     }
  909.     if ( CL_OfsTrk+l<CdcTrak ){
  910.         (*pListStTm)[CL_OfsTrk+l]=O_ListStTm[l];
  911.         (*pListLong)[CL_OfsTrk+l]=i;        // 長さ
  912.         (*pListName)[CL_OfsTrk+l][0]=0;
  913.         (*pListName)[CL_OfsTrk+l][2]=0;
  914.         //if ( DeviType==0x10 )
  915.         //    GetTrackName( l,(*pListName)[CL_OfsTrk+l] );
  916.     }
  917.     ListTrak[SCSI_LUN__][l]=l;    //
  918. }
  919. if ( tt==0 )
  920.     DtTrak=-1;    //-1;データのみ
  921. ListTrak[SCSI_LUN__][max_+1]=max_+1;    //
  922. O_ListStTm[max_+1]=CdLong;
  923. //(*pListStTm)[max_+1]=CdLong;
  924. SetNameAdd=0;
  925. return(0);
  926. }
  927. /************************************************
  928.     CDCLISTより、現在のCDちぇっっく
  929.         先にCdListSub()を実行のこと
  930.  
  931.                 多連装モード考慮ヶ所
  932.                 多連装の場合 CdListSub は
  933.  
  934. [戻り値] 0 : OK、あった 設定した
  935.     -1 : ERR!  なかった
  936. *************************************************/
  937. int    CdListDisp(f)
  938. int    f;    //ファイルポインタ
  939. {
  940. int    l;
  941. CL_StTrk=1;
  942. CL_BkTrk=CdcTrak-1;
  943. CL_ProgN=0;
  944. if ( CdListDisp__(f) ){
  945.     NoTtlFile();
  946.     return(-1);
  947. }
  948. (*pListStTm)[CdTrak+1]=CdLong;
  949. if ( ExTrak!=0 ){
  950.     //拡張トラックがある場合、長さ再計算
  951.     for(l=1;l<=CdTrak;l++){
  952.         (UNint)(*pListLong)[l]&=(UNint)0xFF000000;
  953.         (*pListLong)[l]|=subtime( (*pListStTm)[l+1],(*pListStTm)[l]);
  954.     }
  955. }
  956. return(0);
  957. }
  958. /*******************************
  959. [戻り値] 0 : OK、あった 設定した
  960.     -1 : ERR!  なかった
  961. ********************************/
  962. int    CdListDisp__(f)
  963. int    f;    //ファイルポインタ
  964. {
  965. int    leadout_address,min_,max_;
  966. int    i,j,l;
  967. int    ml;
  968. UNchar    pf;
  969. char    tnum[100];
  970. unsigned char CdLS[9];
  971. unsigned char *s,*d;
  972. int    CL_StTrk_=CL_StTrk;
  973.  
  974. if( RedTOC(&leadout_address,&min_,&max_)!=0 ){
  975.     if( RedTOC(&leadout_address,&min_,&max_)!=0 ){
  976.         //fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
  977.         return(-1);
  978.     }
  979. }
  980. if ( max_>CdcTrak ) max_=CdcTrak;
  981. for(i=0;i<100;tnum[i++]=1);
  982. CdTrak=O_CdTrak;
  983. /*--CdLongを文字列化しておく--*/
  984. i=(CdLong>>16)&0xFF,
  985. CdLS[0]='0'+DIVU(i,10);
  986. CdLS[1]='0'+MODU(i,10);
  987. i=(CdLong>> 8)&0xFF,
  988. CdLS[2]='0'+DIVU(i,10);
  989. CdLS[3]='0'+MODU(i,10);
  990. i=(CdLong    )&0xFF,
  991. CdLS[4]='0'+DIVU(i,10);
  992. CdLS[5]='0'+MODU(i,10);
  993. /*--ファイルの頭にシーク--*/
  994. FseekTop(f);
  995. FgetsInit();            //READ SUB 初期化
  996. for(;;){
  997.     OvTrak=0;
  998.     if ( (int)(s=(UNchar*)Fgets(f))<=0 ) return(-1);    //ファイルエンド
  999.  
  1000.     //fprintf_(1,s);
  1001.     //fprintf_(1,"\r\n");
  1002.  
  1003.     //まずは'    All ('探し
  1004.     if ( s[4]!='A' || s[5]!='l' || s[6]!='l' || s[8]!='(')
  1005.         continue;
  1006.     if ( s[9]!=CdLS[0] || s[10]!=CdLS[1] || s[12]!=CdLS[2]
  1007.              || s[13]!=CdLS[3] || s[15]!=CdLS[4] || s[16]!=CdLS[5] )
  1008.         continue;    //違う
  1009.     s=&s[17];
  1010.     for(;*s!=9;s++);
  1011.     for(;*s==9;s++);
  1012.     d=CdName;
  1013.     for(i=0;i<40-2;i++){
  1014.         if ( (j=(*d++=*s++))==0 )
  1015.             break;
  1016.         if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
  1017.             *d++=*s++;
  1018.             i++;
  1019.         }
  1020.     }
  1021.     for(;i<40;i++)
  1022.         *d++=0;
  1023.     TitleTy[SCSI_LUN__]=CdName[0];
  1024.  
  1025.     //fprintf_(1,CdName);
  1026.     //fprintf_(1,"\r\n");
  1027.  
  1028.     if ( (int)(s=(UNchar*)Fgets(f))<=0 ) return(-1);    //ファイルエンド
  1029.         //1行空のはず
  1030.  
  1031.     CL_StTrk=CL_StTrk_;
  1032.     for(l=min_;l<=max_+1;l++,CL_StTrk++){
  1033.  
  1034.         if ( (int)(s=(UNchar*)Fgets(f))<=0 ) return(-1);    //ファイルエンド
  1035.  
  1036.         //fprintf_(1,s);
  1037.         //fprintf_(1,"\r\n");
  1038.  
  1039.         //中間曲名
  1040.         if ( s[0]==9 && s[1]=='(' && s[2]=='*' && s[3]==')' ){
  1041.             if ( CL_BkTrk<=CL_StTrk || CL_BkTrk<=max_ ){
  1042.                 OvTrak=1;
  1043.                 l--;
  1044.                 CL_StTrk--;
  1045.                 continue;
  1046.                 //break;
  1047.                 //return(1);    //多すぎ
  1048.             }
  1049.             l--;
  1050.             CL_StTrk--;
  1051.             i=(s[ 4]-'0')*0x10000*10+
  1052.               (s[ 5]-'0')*0x10000    +
  1053.               (s[ 7]-'0')*0x100  *10+
  1054.               (s[ 8]-'0')*0x100    +
  1055.               (s[10]-'0')         *10+
  1056.               (s[11]-'0');
  1057.             (UNint)(*pListLong)[CL_StTrk]|=(UNint)0x80000000;    //拡張曲名fg
  1058.             (*pListLong)[CL_BkTrk]=0xFF0000+(CL_StTrk);
  1059.             (*pListStTm)[CL_BkTrk]=i;
  1060.             s=&s[12];
  1061.             for(;*s!=9;s++);
  1062.             for(;*s==9;s++);
  1063.             d=(*pListName)[CL_BkTrk];
  1064.             *d++=0;
  1065.             *d++=0;
  1066.             for(i=2;i<40-2;i++){
  1067.                 if ( (j=(*d++=*s++))==0 )
  1068.                     break;
  1069.                 if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
  1070.                     *d++=*s++;
  1071.                     i++;
  1072.                 }
  1073.             }
  1074.             for(;i<40;i++)
  1075.                 *d++=0;
  1076.             CL_BkTrk--;
  1077.             CeTrak=-1;
  1078.             continue;
  1079.         }
  1080.         //拡張曲名
  1081.         if ( s[0]==' ' && s[1]=='(' && s[4]==')' && s[5]==' ' ){
  1082.             if ( CL_BkTrk<=CL_StTrk || CL_BkTrk<=max_ ){
  1083.                 OvTrak=1;
  1084.                 l--;
  1085.                 CL_StTrk--;
  1086.                 continue;
  1087.                 //break;
  1088.                 //return(1);    //多すぎ
  1089.             }
  1090.             ExTrak=-1;
  1091.             //CL_StTrk--;
  1092.             CdTrak++;
  1093.             l--;
  1094.             i=(s[ 7]-'0')*0x10000*10+
  1095.               (s[ 8]-'0')*0x10000    +
  1096.               (s[10]-'0')*0x100  *10+
  1097.               (s[11]-'0')*0x100    +
  1098.               (s[13]-'0')         *10+
  1099.               (s[14]-'0');
  1100.             //(*pListLong)[CL_StTrk]=O_ListLong[l];
  1101.             (*pListLong)[CL_StTrk]&=0xFFFFFF;    //念のため
  1102.             (*pListStTm)[CL_StTrk]=(O_ListStTm[l]&0x1F000000)+addtime(O_ListStTm[l],i);
  1103.             //ListTrak[SCSI_LUN__][l]=CL_StTrk;    //
  1104.             tnum[l]++;
  1105.             s=&s[15];
  1106.             for(;*s!=9;s++);
  1107.             for(;*s==9;s++);
  1108.             d=(*pListName)[CL_StTrk];
  1109.             for(i=0;i<40-2;i++){
  1110.                 if ( (j=(*d++=*s++))==0 )
  1111.                     break;
  1112.                 if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
  1113.                     *d++=*s++;
  1114.                     i++;
  1115.                 }
  1116.             }
  1117.             for(;i<40;i++)
  1118.                 *d++=0;
  1119.             continue;
  1120.         }
  1121.         if ( l>max_ ){
  1122.             l++;
  1123.             break;
  1124.         }
  1125.         i=(s[ 7]-'0')*0x10000*10+
  1126.           (s[ 8]-'0')*0x10000    +
  1127.           (s[10]-'0')*0x100  *10+
  1128.           (s[11]-'0')*0x100    +
  1129.           (s[13]-'0')         *10+
  1130.           (s[14]-'0');
  1131.         if ( (O_ListLong[l]&0xFFFFFF)!=i )
  1132.             break;    //違う
  1133.         if ( CL_StTrk<CdcTrak ){
  1134.             (*pListStTm)[CL_StTrk] = O_ListStTm[l];
  1135.             (*pListLong)[CL_StTrk] = O_ListLong[l];
  1136.             (*pListLong)[CL_StTrk]&=0xFFFFFF;    //念のため
  1137.             ListTrak[SCSI_LUN__][l]=CL_StTrk;    //
  1138.             s=&s[15];
  1139.             for(;*s!=9;s++);
  1140.             for(;*s==9;s++);
  1141.             d=(*pListName)[CL_StTrk];
  1142.             for(i=0;i<40-2;i++){
  1143.                 if ( (j=(*d++=*s++))==0 )
  1144.                     break;
  1145.                 if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
  1146.                     *d++=*s++;
  1147.                     i++;
  1148.                 }
  1149.             }
  1150.             for(;i<40;i++)
  1151.                 *d++=0;
  1152.         }
  1153.  
  1154.         //fprintf_(1,(*pListName)[CL_StTrk]);
  1155.         //fprintf_(1,"\r\n");
  1156.     }
  1157.     if ( l<=max_+1 )
  1158.         ;
  1159.     else break;
  1160. }
  1161. CdListS=1;    //CDLISTにあるなら 1 
  1162. pf=0;
  1163. /*プログラムはある?*/
  1164.     //ここの文字列は既に読んでいる
  1165. if ( JukeBox==0 ){    // 0:ノーマル 1:JukeBox
  1166.     if ( *s++!='\t' )
  1167.         return(0);
  1168.     if ( *s=='_' )
  1169.         s++;
  1170.     if ( *s++!='<' )
  1171.         return(0);
  1172. } else {
  1173.     if ( *s++!='\t' )
  1174.         return(0);
  1175.     if ( JkDfPrgMd==0 ){    // '_<..>' が、1;あった 0;ない
  1176.         if ( *s=='_' ){
  1177.             CL_ProgN=0;
  1178.             JkDfPrgMd=1;    // '_<..>' が、1;あった 0;ない
  1179.             s++;
  1180.         }
  1181.     } else {
  1182.         if ( *s!='_' )
  1183.             return(0);
  1184.         s++;
  1185.     }
  1186.     if ( *s++!='<' )
  1187.         return(0);
  1188. }
  1189. //ml=MemLong;
  1190. for(ml=CL_ProgN;ml<PrgMax;){
  1191.     for(;*s==' ';s++);
  1192.     i=c_atoi(s,&j);
  1193.     s+=j;
  1194.     if ( i<1 || i>99 )
  1195.         break;
  1196.     if ( ml>=PrgMax )
  1197.         break;
  1198.     for(;*s==' ';s++);
  1199.     MemSock[ml]=ListTrak[SCSI_LUN__][i];
  1200.     pf=1;
  1201.     if ( *s=='.' ){
  1202.         s++;
  1203.         i=c_atoi(s,&j);
  1204.         s+=j;
  1205.         if ( i>=0 && i<=99 )
  1206.             MemSock[ml]+=i;
  1207.     } else if ( *s=='a' || *s=='A' ){
  1208.         s++;
  1209.         for(j=1;j<tnum[i];j++){
  1210.             if ( (ml+1)>=PrgMax )
  1211.                 break;
  1212.             MemSock[++ml]=ListTrak[SCSI_LUN__][i]+j;
  1213.         }
  1214.     } else if ( *s=='-' ){
  1215.         s++;
  1216.         for(;*s==' ';s++);
  1217.         l=c_atoi(s,&j);
  1218.         s+=j;
  1219.         for(i++;i<=l;i++){
  1220.             if ( i<1 || i>99 )
  1221.                 break;
  1222.             if ( (ml+1)>=PrgMax )
  1223.                 break;
  1224.             MemSock[++ml]=ListTrak[SCSI_LUN__][i];
  1225.         }
  1226.     }
  1227.     ml++;
  1228.     for(;*s==' ';s++);
  1229.     if ( *s=='>' ) break;
  1230.     s++;
  1231. }
  1232. if ( *s=='>' ){
  1233.     MemLong=ml;
  1234.     CL_ProgN=ml;
  1235.     if ( pf!=0 )
  1236.         JkDfPrgTY++;    //Def.Prg.のあるトレイ数
  1237. }
  1238. return(0);
  1239. }
  1240. /*****************************************
  1241.     JukeBox 読み込み
  1242.  
  1243. [in]    f == 0 ; タイトルリストなし
  1244.     f != 0 ;ファイルポインタ
  1245. *****************************************/
  1246. int    CdListDispMC(f)
  1247. int    f;    //ファイルポインタ
  1248. {
  1249. int    i,c,s,l;
  1250. int    ln,cl;
  1251. int    _CdLong_=0;
  1252. int    _CdTrak_=0;
  1253. int    _CL_ProgN_=0;
  1254. int    _ExTrak_=0;
  1255. int    tr;
  1256. static UNchar ss[8]="JukeBox";
  1257. CdListS=0;    //CDLISTにあるなら 1 
  1258. CeTrak=0;
  1259. DtTrak=0;
  1260. MD_SeqSecTrak=0;        // 1;MD セパレートトラック有り
  1261. MD_MonoTrak=0;            // -1;MONOトラックのみ,1;有り(禁止),0;なし
  1262. MemLong=0;        //メモリながさ
  1263. CL_StTrk=1;
  1264. CL_BkTrk=CdcTrak-1;
  1265. CL_ProgN=0;
  1266.  
  1267. JkDfPrgTY=0;    //Def.Prg.のあるトレイ数
  1268. JkDfPrgMd=0;    // '_<..>' が、1;あった 0;ない
  1269. tr=-1;
  1270. for(l=0;l<100;l++)
  1271.     O_ListLong[l]=0;
  1272. for(l=0;l<CdcTrak;l++){
  1273.     (*pListName)[l][0]=0;
  1274.     (*pListName)[l][2]=0;
  1275.     (*pListLong)[l]=0;
  1276. }
  1277. for(ln=0;ln<LUN_MAX;ln++){
  1278.     ExTrak=0;
  1279.     SetLUN_(ln);
  1280.     CL_OfsTrk=CL_StTrk-1;
  1281.     if ( CdListSub__()!=0 )
  1282.         continue;
  1283.     if ( tr<0 )
  1284.         tr=ln;
  1285.     c=CdLong;
  1286.     s=CL_StTrk-1;
  1287.     _CL_ProgN_=CL_ProgN;
  1288.     cl=CdListDisp__(f);
  1289.     if ( cl!=0 ){
  1290.         /*LISTに無かった*/
  1291.         for(l=1;l<=CdTrak;l++){
  1292.             ListTrak[ln][l]=l+s;
  1293.             (*pListStTm)[CL_StTrk+l-1]=O_ListStTm[l];
  1294.             (*pListLong)[CL_StTrk+l-1]=O_ListLong[l]&0xFFFFFF;    // 長さ
  1295.             (*pListName)[CL_StTrk+l-1][0]=0;
  1296.             if ( DeviType==0x10 )
  1297.                 GetTrackName( l,(*pListName)[CL_StTrk+l-1] );
  1298.         }
  1299.         CL_StTrk+=CdTrak;
  1300.     }
  1301.     if ( _CL_ProgN_==CL_ProgN && cl==0 ){
  1302.         /*プログラムがなかった*/
  1303.         if ( JkDfPrgMd==0 ){    // '_<..>' が、1;あった 0;ない
  1304.             for(l=1;l<=CdTrak;l++){
  1305.                 if ( CL_ProgN<PrgMax ){
  1306.                     if ( (*pListStTm)[l+s]>=0 )    //データトラックは入れない
  1307.                         MemSock[CL_ProgN++]=l+s;
  1308.                 }
  1309.             }
  1310.             MemLong=CL_ProgN;
  1311.         }
  1312.     }
  1313.     (*pListStTm)[s+CdTrak+1]=c;
  1314.     _ExTrak_|=ExTrak;
  1315.     if ( ExTrak!=0 ){
  1316.         //拡張トラックがある場合、長さ再計算
  1317.         for(l=s+1;l<=s+CdTrak;l++){
  1318.             if ( l<CdcTrak ){
  1319.                 (UNint)(*pListLong)[l]&=(UNint)0xFF000000;
  1320.                 (*pListLong)[l]|=subtime( (*pListStTm)[l+1],(*pListStTm)[l] );
  1321.             }
  1322.         }
  1323.     }
  1324.     _CdLong_=addtime_(_CdLong_,CdLong);
  1325.     _CdTrak_+=CdTrak;
  1326. }
  1327. if ( tr>=0 )
  1328.     SetLUN_(tr);
  1329. else    SetLUN_(0);
  1330. // 騙し 変数 //
  1331. CDIN=1;
  1332. if ( _CdTrak_>=CdcTrak )
  1333.     _CdTrak_=CdcTrak;
  1334. CdLong = _CdLong_;
  1335. CdTrak = _CdTrak_;
  1336. DtTrak = 0;
  1337. if ( _ExTrak_!=0 )
  1338.     ExTrak=-1;
  1339. MD_SeqSecTrak=0;        // 1;MD セパレートトラック有り
  1340. MD_MonoTrak=0;            // -1;MONOトラックのみ,1;有り(禁止),0;なし
  1341. if ( CdTrak+1<CdcTrak )
  1342.     (*pListStTm)[CdTrak+1]=CdLong;
  1343. for(i=0;i<8;i++)
  1344.     CdName[i]=ss[i];
  1345. O_CdTrak=CdTrak;
  1346. O_ListStTm[1]=(*pListStTm)[1];
  1347. if ( JkDfPrgTY==0 ){    //Def.Prg.のあるトレイ数
  1348.     MemLong=0;        //メモリながさ
  1349. }
  1350. return(0);
  1351. }
  1352. /*****************************
  1353.     タイトルリストに無し
  1354.     タイトルリスト無し
  1355. *****************************/
  1356. void    NoTtlFile()
  1357. {
  1358. int    l;
  1359. for(l=1;l<=O_CdTrak;l++){
  1360.     (*pListStTm)[l]=O_ListStTm[l];
  1361.     (*pListLong)[l]=O_ListLong[l];        // 長さ
  1362.     ListTrak[SCSI_LUN__][l]=l;
  1363.     (*pListName)[l][0]=0;
  1364.     if ( DeviType==0x10 )
  1365.         GetTrackName( l,(*pListName)[l] );
  1366. }
  1367. CdName[0]=0;
  1368. if ( DeviType==0x10 ){
  1369.     if ( GetTrackName( 0,CdName ) ){
  1370.         if ( O_CdTrak==1 && CdLong==0 ){
  1371.             DtTrak=1;    //1;データトラック有り
  1372.             CdName[0]='M';
  1373.             CdName[1]='D';
  1374.             CdName[2]='-';
  1375.             CdName[3]='D';
  1376.             CdName[4]='A';
  1377.             CdName[5]='T';
  1378.             CdName[6]='A';
  1379.             CdName[7]=0;
  1380.         }
  1381.     }
  1382. }
  1383. CdTrak=O_CdTrak;
  1384. CeTrak=0;
  1385. ExTrak=0;
  1386. }
  1387. /****************************
  1388.     名前部分を初期化  (いらないルーチン!!?)
  1389. *****************************/
  1390. void    CdNameClr()
  1391. {
  1392. int    l;
  1393. CdName[0]=0;
  1394. TitleTy[SCSI_LUN__]=0;
  1395. for(l=0;l<CdcTrak;l++){
  1396.     (*pListName)[l][0]=0;
  1397.     (*pListName)[l][2]=0;
  1398.     (UNint)(*pListLong)[l]&=(UNint)0x00FFFFFF;    //拡張曲名fg 消す
  1399. }
  1400. SetNameAdd=0;
  1401. }
  1402. /******************************
  1403.     文字列を数字に
  1404. ******************************/
  1405. int    c_atoi(m,n)
  1406. UNchar    *m;
  1407. int    *n;
  1408. {
  1409. int    i=0,j=0;
  1410. for(;;){
  1411.     if ( *m<(UNchar)'0' || *m>(UNchar)'9' )
  1412.         break;
  1413.     i=i*10+*m-'0';    j++;    m++;
  1414. }
  1415. *n=j;        /*うごいたかず!!*/
  1416. return(i);
  1417. }
  1418.  
  1419.  
  1420. /*----------------------------------------------------------------------------
  1421.             演奏割り込みルーチン
  1422.                 使用順
  1423. ----------------------------------------------------------------------------*/
  1424. /************************************
  1425.          BGM
  1426.     {演奏していないなら演奏}
  1427. ************************************/
  1428. void    CdPlay_Bgm()
  1429. {
  1430. extern    int    BgmStAdds,BgmEdAdds;
  1431. if ( CDIN==0 ){
  1432.     B_KLE_D2();
  1433.     return;
  1434. }
  1435. if ( MastVol==0 || Fadeouting==0 ){    // 0:ノーマル 1:フェードアウト中
  1436.     if ( TrkNo==0 ){
  1437.         if ( BgmStAdds<0 ){
  1438.             FlgClrS();
  1439.             B_KLE_D2();
  1440.             return;
  1441.         }
  1442.         CdPlay_hf(BgmStAdds,BgmEdAdds);
  1443.     }
  1444.     B_KLE_D2();
  1445.     return;
  1446. }
  1447. FadeoutDisp();
  1448. if ( TrkNo==0 )
  1449.     FlgClrS();
  1450. B_KLE_D2();
  1451. return;
  1452. }
  1453. /************************************
  1454.          リピート(1P)
  1455.     {演奏していないなら演奏}
  1456.     {違うトラックなら演奏}
  1457. ************************************/
  1458. void    CdPlay_Rept()
  1459. {
  1460. if ( CDIN==0 ){
  1461.     B_KLE_D2();
  1462.     return;
  1463. }
  1464. if ( FadeoutDisp() ){
  1465.     //B_KLE_D2();
  1466.     return;
  1467. }
  1468. if ( TrkNo==0 ){
  1469.     CdPlay_hf(TrkNoS,TrkNoS);
  1470. } else if ( plyinf.track_no!=TrkNoS ){
  1471.     CdPlay_hf(TrkNoS,TrkNoS);
  1472. }
  1473. B_KLE_D2();
  1474. return;
  1475. }
  1476. /************************************
  1477.          ランダム
  1478.     演奏していないなら演奏
  1479. ************************************/
  1480. void    CdPlay_Rnd()
  1481. {
  1482. int    i,j,r;
  1483. if ( CDIN==0 ){
  1484.     B_KLE_D2();
  1485.     return;
  1486. }
  1487. if ( FadeoutDisp() ){
  1488.     //B_KLE_D2();
  1489.     return;
  1490. }
  1491. if ( TrkNo!=0 ){    //演奏している
  1492.     B_KLE_D2();
  1493.     return;
  1494. }
  1495. if ( ChnLunWaiting>=0 ){
  1496.     CdPlay_hf( ChnLunWaiting,0 );
  1497.     B_KLE_D2();
  1498.     return;
  1499. }
  1500. if ( RndPt<0 ){
  1501.     i=CdPlay_Rnd2();
  1502. } else if ( ++RndPt>=RndLong ){
  1503.     if ( AutoMode==0 ){    // 0:ノーマル 1:オート
  1504.         TrkNo=0;
  1505.         TrkNoS=0;
  1506.         RndPt--;    //演奏ストップ
  1507.         RndMode=0;    // 0:ノーマル 1:ランダム
  1508.         B_KLE_D2();
  1509.         return;
  1510.     } else {
  1511.         i=CdPlay_Rnd2();
  1512.     }
  1513. } else {
  1514.     i=RndSock[RndPt];
  1515. }
  1516. if ( NextTrakLun(i) ) return;
  1517. CdPlay_hf( i,i );
  1518. MemChkT();
  1519. B_KLE_D2();
  1520. return;
  1521. }
  1522. /*++++++++++++++*/
  1523. int    CdPlay_Rnd2()        //out 曲ナンバー
  1524. {
  1525. int    i,h,r,l,j;
  1526. if ( CDIN==0 )
  1527.     return(0);
  1528. if ( MemLong==0 ){
  1529.     for(i=0;i<max;i++)
  1530.         RndSock[i]=i+1;    // ランダムテーブル
  1531.     RndLong=max;
  1532. } else {
  1533.     for(i=0;i<MemLong;i++)
  1534.         RndSock[i]=MemSock[i];    // ランダムテーブル
  1535.     RndLong=MemLong;
  1536. }
  1537. //Randomize(*(short*)(0x09CC));
  1538. for(i=0;i<100;i++){
  1539.     h=MODU(Rand(),RndLong);
  1540.     l=MODU(Rand(),RndLong);
  1541.     if ( l==h )
  1542.         l=MODU(Rand(),RndLong);
  1543.     j=RndSock[h];
  1544.     RndSock[h]=RndSock[l];
  1545.     RndSock[l]=j;
  1546. }
  1547. if ( TrkNoS==RndSock[0] ){
  1548.     j=RndSock[0];
  1549.     RndSock[0]=RndSock[RndLong-1];
  1550.     RndSock[RndLong-1]=j;
  1551. }
  1552. RndPt=0;
  1553. i=RndSock[RndPt];
  1554. return(i);
  1555. }
  1556. /************************************
  1557.          メモリー
  1558.     (メモリー+AUTO)
  1559.     {演奏していないなら演奏}
  1560. ************************************/
  1561. void    CdPlay_Mem()
  1562. {
  1563. int    i,r;
  1564. if ( CDIN==0 ){
  1565.     B_KLE_D2();
  1566.     return;
  1567. }
  1568. if ( FadeoutDisp() ){
  1569.     //B_KLE_D2();
  1570.     return;
  1571. }
  1572. if ( TrkNo!=0 ){    //演奏している
  1573.     B_KLE_D2();
  1574.     return;
  1575. }
  1576. if ( ChnLunWaiting>=0 ){
  1577.     CdPlay_hf( ChnLunWaiting,0 );
  1578.     B_KLE_D2();
  1579.     return;
  1580. }
  1581. if ( AutoMode==0 && TrkNoS==0 ){
  1582.     B_KLE_D2();
  1583.     return;
  1584. }
  1585. if ( ++MemPt>=MemLong ){
  1586.     if ( AutoMode==0 ){    // 0:ノーマル 1:オート
  1587.         TrkNo=0;
  1588.         TrkNoS=0;
  1589.         MemMode=0;    // 0:ノーマル 1:メモリー
  1590.         MemPt--;    //演奏ストップ
  1591.         B_KLE_D2();
  1592.         return;
  1593.     } else {
  1594.         MemPt=0;
  1595.     }
  1596. }
  1597. i=MemSock[MemPt];
  1598. if ( NextTrakLun(i) ) return;
  1599. CdPlay_hf( i,i );
  1600. B_KLE_D2();
  1601. return;
  1602. }
  1603. /*++++++++++++++*/
  1604. void    MemChkT()
  1605. {
  1606. int    i;
  1607. if ( TrkNo==0 ){
  1608.     MemPt=-1;
  1609.     return;
  1610. }
  1611. for(i=0;i<MemLong;i++)
  1612.     if ( TrkNo==MemSock[i] )
  1613.         break;
  1614. if ( i<MemLong )
  1615.     MemPt=i;
  1616.  else    MemPt=-1;
  1617. }
  1618. /************************************
  1619.        オート[*]
  1620.     {演奏していないなら演奏}
  1621.     {TrkNoもちがうなら更新する}
  1622. ************************************/
  1623. void    CdPlay_Auto()
  1624. {
  1625. int    i;
  1626. if ( CDIN==0 ){
  1627.     B_KLE_D2();
  1628.     return;
  1629. }
  1630. if ( FadeoutDisp() ){
  1631.     //B_KLE_D2();
  1632.     return;
  1633. }
  1634. if ( TrkNo!=0 && plyinf.track_no!=TrkNo ){
  1635.     TrkNo=plyinf.track_no;
  1636.     TrkNoS=TrkNo;
  1637.     SetTrkLong();
  1638.     MemChkT();
  1639. }
  1640. if ( ChnLunWaiting>=0 ){
  1641.     CdPlay_hf( ChnLunWaiting,0 );
  1642.     B_KLE_D2();
  1643.     return;
  1644. }
  1645. if ( MemLong!=0 ){
  1646.     MemMode=-1;    // 0:ノーマル 1:メモリー
  1647.     CdPlay_Mem();
  1648.     return;
  1649. }
  1650. if ( TrkNo==0 ){
  1651.     if ( TrkNoS>=max ){
  1652.         i=1;
  1653.         if ( NextTrakLun(i) ) return;
  1654.         CdPlay_hf(i,-1);
  1655.     } else {
  1656.         i=TrkNoS+1;
  1657.         if ( NextTrakLun(i) ) return;
  1658.         CdPlay_hf(i,-1);
  1659.     }
  1660. }
  1661. B_KLE_D2();
  1662. return;
  1663. }
  1664. /************************************
  1665.      ノーマルCDチェック
  1666.     {TrkNoもちがうなら更新する}
  1667. ************************************/
  1668. void    CdPlay___()
  1669. {
  1670. int    i;
  1671. if ( CDIN==0 ){
  1672.     B_KLE_D2();
  1673.     return;
  1674. }
  1675. if ( FadeoutDisp() ){
  1676.     //B_KLE_D2();
  1677.     return;
  1678. }
  1679. if ( ChnLunWaiting>=0 ){
  1680.     CdPlay_hf( ChnLunWaiting,0 );
  1681.     B_KLE_D2();
  1682.     return;
  1683. }
  1684. if ( TrkNo==0 ){
  1685.     if ( TrkNoS==0 ){
  1686.         ;
  1687.     } else if ( CdPlayEndTrak<0 ){
  1688.         TrkNoS=0;
  1689.     //} else if ( JukeBox!=0 && TrkNoS<max ){
  1690.     } else if ( TrkNoS<max ){
  1691.         i=TrkNoS+1;
  1692.         if ( CdPlayEndTrak>0 && TrkNoS>CdPlayEndTrak ){
  1693.             TrkNoS=0;
  1694.             B_KLE_D2();
  1695.             return;
  1696.         }
  1697.         if ( NextTrakLun(i) ) return;
  1698.         CdPlay_hf(i,-1);
  1699.     } else {
  1700.         TrkNoS=0;
  1701.     }
  1702.     B_KLE_D2();
  1703.     return;
  1704. }
  1705. if ( TrkNoS!=0 && plyinf.track_no!=TrkNo ){
  1706.     TrkNo=plyinf.track_no;
  1707.     TrkNoS=TrkNo;
  1708.     SetTrkLong();
  1709.     MemChkT();
  1710. }
  1711. B_KLE_D2();
  1712. return;
  1713. }
  1714. /*********************************
  1715.     次の曲のLUNチェック
  1716. in tt=トラック
  1717. out ; = 0 同じLUN
  1718.     -1 違うLUN
  1719. **********************************/
  1720. int    NextTrakLun(tt)
  1721. int    tt;
  1722. {
  1723. int    i,j,l,s;
  1724. if ( PLAYSCSTS==0 ){        // 1;STSIN待ち 0;待たず
  1725.     s = (*pListStTm)[tt];    // スタート時間
  1726.     //LUN変更
  1727.     //    (T00KLLLL_MMMMMMMM_SSSSSSSS_FFFFFFFF)
  1728.     //        ^ロジカル有効フラグ
  1729.     //         ^^^^ ロジカル
  1730.     if ( JukeBox==0 || (s&0x10000000)==0 )
  1731.         return(0);
  1732.     i=(s/0x01000000)&0xF;
  1733.     if ( i==SCSI_LUN__ )
  1734.         return(0);
  1735.     SetLUN_( i );
  1736.     ejeload();        //トレイを出して直ぐ戻す。MBR-7ならいいが・・・
  1737.     WaitCC_100();
  1738.     ChnLunWaiting=tt;
  1739.     return(-1);
  1740. } else {
  1741.     return(0);
  1742. }
  1743. }
  1744. /*********************************
  1745.     フェードアウト
  1746.         チェック&処理
  1747. [戻り値] 0 
  1748.     -1 ; 演奏が終わった。
  1749. **********************************/
  1750. int    FadeoutDisp()
  1751. {
  1752. if ( TrkNo==0 || MastVol==0 || Fadeouting==0 )    // 0:ノーマル 1:フェードアウト中
  1753.     return(0);
  1754. if ( FadeoutVol>64 ){        // 数値以下ならゆっくりフェードアウト
  1755.     FadeoutVol-=FadeoutDec;
  1756. } else if ( FadeoutVol>24 ){        // 数値以下ならゆっくりフェードアウト
  1757.     if ( FadeoutDec>2 )
  1758.         FadeoutVol-=FadeoutDec/2;
  1759.     else    FadeoutVol--;
  1760. } else {
  1761.     if ( FadeoutDec>4 )
  1762.         FadeoutVol-=FadeoutDec/4;
  1763.     else    FadeoutVol--;
  1764. }
  1765. if ( FadeoutVol>=0 ){
  1766.     ChnVol_(FadeoutVol);
  1767.     return(0);
  1768. }
  1769. if ( FadeoutVol>-8*2 ){
  1770.     ChnVol_(0);
  1771.     return(0);
  1772. }
  1773. Fadeouting=0;    // 0:ノーマル 1:フェードアウト中
  1774. TrkNo=0;
  1775. if ( DeviType!=0x10 )
  1776.     StpDsk();
  1777. else    ZeroUnit();
  1778. return(-1);
  1779. }
  1780.